package cc.sunni.controller;

import cc.sunni.entity.FaceUser;
import cc.sunni.service.FaceUserService;
import cc.sunni.utils.FaceUtil;
import cc.sunni.utils.ImageUtils;
import cc.sunni.utils.MultipartFileToFile;
import cc.sunni.utils.R;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;

@RestController
@RequestMapping("/face")
public class FacePlusLoginController {
    @Autowired
    private FaceUserService faceUserService;

    @PostMapping("/login1")
    public R login1(MultipartFile file) {
        if (file == null) {
            return R.error("人脸照片不能为空");
        }
        File image = null;
        try {
            image = MultipartFileToFile.multipartFileToFile(file);
            // 检测图片
            String faceToken = FaceUtil.detect(image);
            if (StringUtils.isEmpty(faceToken)) {
                // 未检测到人脸
                return R.error("照片中未检测出人脸");
            } else {
                // 查询照片是否在faceSet中存在,返回faceSet中的faceToken
                String faceSetToken = FaceUtil.search(faceToken);
                if (StringUtils.isEmpty(faceSetToken)) {
                    return R.error("人脸信息未注册，请先注册");
                } else {
                    // 查询用户
                    FaceUser faceUser = faceUserService.getOne(new LambdaQueryWrapper<FaceUser>().eq(FaceUser::getFaceToken, faceSetToken));
                    return R.ok(faceUser);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            return R.error("人脸识别异常");
        } finally {
            // 删除缓存图片
            MultipartFileToFile.delteTempFile(image);
        }
    }

    @PostMapping("/login")
    public R login(HttpServletRequest request) {
        // 获取人脸图片
        File file = ImageUtils.uploadImg(request, "imgData", "image");
        try {
            // 检测图片
            String faceToken = FaceUtil.detect(file);
            if (StringUtils.isEmpty(faceToken)) {
                // 未检测到人脸
                return R.error("系统未检测到人脸");
            } else {
                // 查询照片是否在faceSet中存在
                String res = FaceUtil.search(faceToken);
                if (StringUtils.isEmpty(res)) {
                    return R.error("人脸信息未注册，请先注册");
                } else {
                    // 查询用户
                    FaceUser faceUser = faceUserService.getOne(new LambdaQueryWrapper<FaceUser>().eq(FaceUser::getFaceToken, res));
                    return R.ok(faceUser);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            return R.error("人脸识别异常");
        } finally {
            // 登录接口删除图片
            file.delete();
        }
    }

    @PostMapping("/register")
    public R register(HttpServletRequest request) {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password)) {
            return R.error("用户名和密码不能为空");
        }
        // 获取人脸图片
        File file = ImageUtils.uploadImg(request, "imgData", "image");
        Boolean flag = true;
        try {
            // 检测图片
            String faceToken = FaceUtil.detect(file);
            if (StringUtils.isEmpty(faceToken)) {
                // 未检测到人脸
                return R.error("系统未检测到完整人脸");
            } else {
                // 查询照片是否在faceSet中存在
                String face = FaceUtil.search(faceToken);
                if (StringUtils.isEmpty(face)) {
                    // 添加faceToken到faceSet
                    if (FaceUtil.addFace(faceToken)) {
                        FaceUser faceUser = new FaceUser();
                        faceUser.setUserId(username);
                        faceUser.setPassword(password);
                        faceUser.setFaceToken(faceToken);
                        faceUserService.save(faceUser);
                        flag = false;
                        return R.ok();
                    } else {
                        return R.error("注册失败,请稍后再试");
                    }
                } else {
                    return R.error("人脸信息已经注册过");
                }
            }
        } catch (Exception e) {
            return R.error("人脸识别异常");
        } finally {
            if (flag) {
                file.delete();
            }
        }
    }
}
